<?php
declare (strict_types = 1);

namespace app\api\controller;

class Index
{
    public function index()
    {
        return '您好！这是一个[api]示例应用';
    }

    public function upload(Request $request)
    {
        $params = $request->param();
        $fileId = $params['fileId']; // 文件唯一标识
        $chunkIndex = $params['chunkIndex']; // 分片索引
        $chunkCount = $params['chunkCount']; // 分片总数
        $fileExt = $params['ext']; // 文件后缀
        $tmpDir = env("SERVER_OSS") . '/temp/'; // 临时文件夹路径

        $filePath = $tmpDir . $fileId;
        // 确保临时文件夹存在
        if (!is_dir($filePath)) mkdir($filePath, 0777, true);

        // 构建分片文件路径
        $filePath = $filePath . '/' . $chunkIndex . '.part';
        // 保存分片文件
        if (move_uploaded_file($_FILES['file']['tmp_name'], $filePath)) {
            if ($chunkIndex == $chunkCount - 1){
                $this->uploadMerge($fileId, $chunkCount,$fileExt,$params['fileName'] ?? '');
            }
            return json(['status' => 'success', 'message' => 'Chunk uploaded successfully']);
        } else {
            return json(['status' => 'error', 'message' => 'Failed to upload chunk']);
        }
    }
    private function uploadMerge($fileId, $chunkCount,$fileExt,$fileName = '')
    {
        // 绝对路径
        $outputPath = env("SERVER_OSS") . "/oss/";
        $tmpDir = env("SERVER_OSS") . '/temp/'; // 临时文件夹路径
        // 确保输出文件夹存在
        if (!is_dir($outputPath)) mkdir($outputPath, 0777, true);

        // 构建最终文件路径
        $outputFile = $outputPath . $fileName . '.' . $fileExt;

        // 读取分片总数
        $chunkCount = intval($chunkCount);
        // 合并分片
        $finalFile = fopen($outputFile, 'wb');
        if ($finalFile !== false){
            for ($i = 0; $i < $chunkCount; $i++) {
                $chunkFile = $tmpDir . $fileId . '/' . $i . '.part';
                if (file_exists($chunkFile)) {
                    $handle = fopen($chunkFile, 'rb');
                    stream_copy_to_stream($handle, $finalFile);
                    fclose($handle);
                    unlink($chunkFile); // 删除分片文件
                }
            }
            // 删除临时文件夹
            rmdir($tmpDir . $fileId);
            return json(['status' => 'success', 'message' => 'File combined successfully']);
        }
        return json(['status' => 'fail', 'message' => 'File combined failed']);
    }
    // 前端demo
    // <template>
    //  <div>
    //    <input type="file" @change="handleFileUpload" />
    //  </div>
    //</template>
    //
    //<script>
    //import axios from 'axios';
    //
    //export default {
    //  methods: {
    //    handleFileUpload(event) {
    //      const file = event.target.files[0];
    //      const chunkSize = 2048 * 2048; // 1MB
    //      const chunkCount = Math.ceil(file.size / chunkSize);
    //      const fileId = 'unique_file_id_' + Date.now();
    //
    //      if (chunkCount > 1) {
    //        this.uploadChunks(file, chunkCount, fileId,chunkSize);
    //      } else {
    //        // 如果文件小于1MB，直接上传整个文件
    //        const formData = new FormData();
    //        formData.append('file', file);
    //        formData.append('fileId', fileId);
    //        formData.append('fileName', file.name);
    //        formData.append('chunkIndex', 0);
    //        formData.append('chunkCount', 1);
    //        formData.append('ext', file.name.split('.').pop());
    //
    //        // axios.post('http://www.tp8.com/index/upload', formData, {
    //        // axios.post('http://www.evpadmin.com/api/common/upload', formData, {
    //        axios.post('http://192.168.1.69/engineering/lvpadmin-engineering/public/api/common/fragmentUpload', formData, {
    //          headers: {
    //            'Content-Type': 'multipart/form-data',
    //            'token': '5c7c2616-8c3c-44eb-acb3-5a48cea4c8f9'
    //          }
    //        }).then(response => {
    //          if (response.data.code === 1) {
    //            console.log('File uploaded and combined successfully');
    //          } else {
    //            console.error('Failed to upload file');
    //          }
    //        })
    //            .catch(error => {
    //              console.error('Upload error', error);
    //            });
    //      }
    //    },
    //
    //    uploadChunks(file, chunkCount, fileId,chunkSize) {
    //      let index = 0;
    //      const uploadChunk = (index) => {
    //        const chunk = file.slice(index * chunkSize, (index + 1) * chunkSize);
    //        const formData = new FormData();
    //        formData.append('file', chunk);
    //        formData.append('fileId', fileId);
    //        formData.append('fileName', file.name);
    //        formData.append('chunkIndex', index);
    //        formData.append('chunkCount', chunkCount);
    //        formData.append('ext', file.name.split('.').pop());
    //
    //        // axios.post('http://www.tp8.com/api/index/upload', formData, {
    //          headers: {
    //            'Content-Type': 'multipart/form-data',
    //            'token': '5c7c2616-8c3c-44eb-acb3-5a48cea4c8f9'
    //          }
    //        }).then(response => {
    //          if (response.data.code === 1) {
    //            if (index < chunkCount - 1) {
    //              index++;
    //              uploadChunk(index);
    //            } else {
    //              console.log('All chunks uploaded successfully');
    //            }
    //          } else {
    //            console.error('Failed to upload chunk', response.data.message);
    //            // 可以在这里添加重试逻辑
    //          }
    //        })
    //            .catch(error => {
    //              console.error('Upload error', error);
    //              // 可以在这里添加重试逻辑
    //            });
    //      };
    //      uploadChunk(index);
    //    }
    //  }
    //}
    //</script>
}
